1   /*
2    * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  
26  package java.lang.reflect;
27  
28  import sun.reflect.ConstructorAccessor;
29  import sun.reflect.Reflection;
30  import sun.reflect.generics.repository.ConstructorRepository;
31  import sun.reflect.generics.factory.CoreReflectionFactory;
32  import sun.reflect.generics.factory.GenericsFactory;
33  import sun.reflect.generics.scope.ConstructorScope;
34  import java.lang.annotation.Annotation;
35  import java.util.Map;
36  import sun.reflect.annotation.AnnotationParser;
37  import java.lang.annotation.AnnotationFormatError;
38  import java.lang.reflect.Modifier;
39  
40  /**
41   * {@code Constructor} provides information about, and access to, a single
42   * constructor for a class.
43   *
44   * <p>{@code Constructor} permits widening conversions to occur when matching the
45   * actual parameters to newInstance() with the underlying
46   * constructor's formal parameters, but throws an
47   * {@code IllegalArgumentException} if a narrowing conversion would occur.
48   *
49   * @param <T> the class in which the constructor is declared
50   *
51   * @see Member
52   * @see java.lang.Class
53   * @see java.lang.Class#getConstructors()
54   * @see java.lang.Class#getConstructor(Class[])
55   * @see java.lang.Class#getDeclaredConstructors()
56   *
57   * @author      Kenneth Russell
58   * @author      Nakul Saraiya
59   */
60  public final
61      class Constructor<T> extends AccessibleObject implements
62                                                      GenericDeclaration,
63                                                      Member {
64  
65      private Class<T>            clazz;
66      private int                 slot;
67      private Class<?>[]          parameterTypes;
68      private Class<?>[]          exceptionTypes;
69      private int                 modifiers;
70      // Generics and annotations support
71      private transient String    signature;
72      // generic info repository; lazily initialized
73      private transient ConstructorRepository genericInfo;
74      private byte[]              annotations;
75      private byte[]              parameterAnnotations;
76  
77      // Generics infrastructure
78      // Accessor for factory
79      private GenericsFactory getFactory() {
80          // create scope and factory
81          return CoreReflectionFactory.make(this, ConstructorScope.make(this));
82      }
83  
84      // Accessor for generic info repository
85      private ConstructorRepository getGenericInfo() {
86          // lazily initialize repository if necessary
87          if (genericInfo == null) {
88              // create and cache generic info repository
89              genericInfo =
90                  ConstructorRepository.make(getSignature(),
91                                             getFactory());
92          }
93          return genericInfo; //return cached repository
94      }
95  
96      private volatile ConstructorAccessor constructorAccessor;
97      // For sharing of ConstructorAccessors. This branching structure
98      // is currently only two levels deep (i.e., one root Constructor
99      // and potentially many Constructor objects pointing to it.)
100     private Constructor<T>      root;
101 
102     /**
103      * Package-private constructor used by ReflectAccess to enable
104      * instantiation of these objects in Java code from the java.lang
105      * package via sun.reflect.LangReflectAccess.
106      */
107     Constructor(Class<T> declaringClass,
108                 Class<?>[] parameterTypes,
109                 Class<?>[] checkedExceptions,
110                 int modifiers,
111                 int slot,
112                 String signature,
113                 byte[] annotations,
114                 byte[] parameterAnnotations)
115     {
116         this.clazz = declaringClass;
117         this.parameterTypes = parameterTypes;
118         this.exceptionTypes = checkedExceptions;
119         this.modifiers = modifiers;
120         this.slot = slot;
121         this.signature = signature;
122         this.annotations = annotations;
123         this.parameterAnnotations = parameterAnnotations;
124     }
125 
126     /**
127      * Package-private routine (exposed to java.lang.Class via
128      * ReflectAccess) which returns a copy of this Constructor. The copy's
129      * "root" field points to this Constructor.
130      */
131     Constructor<T> copy() {
132         // This routine enables sharing of ConstructorAccessor objects
133         // among Constructor objects which refer to the same underlying
134         // method in the VM. (All of this contortion is only necessary
135         // because of the "accessibility" bit in AccessibleObject,
136         // which implicitly requires that new java.lang.reflect
137         // objects be fabricated for each reflective call on Class
138         // objects.)
139         Constructor<T> res = new Constructor<>(clazz,
140                                                 parameterTypes,
141                                                 exceptionTypes, modifiers, slot,
142                                                 signature,
143                                                 annotations,
144                                                 parameterAnnotations);
145         res.root = this;
146         // Might as well eagerly propagate this if already present
147         res.constructorAccessor = constructorAccessor;
148         return res;
149     }
150 
151     /**
152      * Returns the {@code Class} object representing the class that declares
153      * the constructor represented by this {@code Constructor} object.
154      */
155     public Class<T> getDeclaringClass() {
156         return clazz;
157     }
158 
159     /**
160      * Returns the name of this constructor, as a string.  This is
161      * the binary name of the constructor's declaring class.
162      */
163     public String getName() {
164         return getDeclaringClass().getName();
165     }
166 
167     /**
168      * Returns the Java language modifiers for the constructor
169      * represented by this {@code Constructor} object, as an integer. The
170      * {@code Modifier} class should be used to decode the modifiers.
171      *
172      * @see Modifier
173      */
174     public int getModifiers() {
175         return modifiers;
176     }
177 
178     /**
179      * Returns an array of {@code TypeVariable} objects that represent the
180      * type variables declared by the generic declaration represented by this
181      * {@code GenericDeclaration} object, in declaration order.  Returns an
182      * array of length 0 if the underlying generic declaration declares no type
183      * variables.
184      *
185      * @return an array of {@code TypeVariable} objects that represent
186      *     the type variables declared by this generic declaration
187      * @throws GenericSignatureFormatError if the generic
188      *     signature of this generic declaration does not conform to
189      *     the format specified in
190      *     <cite>The Java&trade; Virtual Machine Specification</cite>
191      * @since 1.5
192      */
193     public TypeVariable<Constructor<T>>[] getTypeParameters() {
194       if (getSignature() != null) {
195         return (TypeVariable<Constructor<T>>[])getGenericInfo().getTypeParameters();
196       } else
197           return (TypeVariable<Constructor<T>>[])new TypeVariable[0];
198     }
199 
200 
201     /**
202      * Returns an array of {@code Class} objects that represent the formal
203      * parameter types, in declaration order, of the constructor
204      * represented by this {@code Constructor} object.  Returns an array of
205      * length 0 if the underlying constructor takes no parameters.
206      *
207      * @return the parameter types for the constructor this object
208      * represents
209      */
210     public Class<?>[] getParameterTypes() {
211         return (Class<?>[]) parameterTypes.clone();
212     }
213 
214 
215     /**
216      * Returns an array of {@code Type} objects that represent the formal
217      * parameter types, in declaration order, of the method represented by
218      * this {@code Constructor} object. Returns an array of length 0 if the
219      * underlying method takes no parameters.
220      *
221      * <p>If a formal parameter type is a parameterized type,
222      * the {@code Type} object returned for it must accurately reflect
223      * the actual type parameters used in the source code.
224      *
225      * <p>If a formal parameter type is a type variable or a parameterized
226      * type, it is created. Otherwise, it is resolved.
227      *
228      * @return an array of {@code Type}s that represent the formal
229      *     parameter types of the underlying method, in declaration order
230      * @throws GenericSignatureFormatError
231      *     if the generic method signature does not conform to the format
232      *     specified in
233      *     <cite>The Java&trade; Virtual Machine Specification</cite>
234      * @throws TypeNotPresentException if any of the parameter
235      *     types of the underlying method refers to a non-existent type
236      *     declaration
237      * @throws MalformedParameterizedTypeException if any of
238      *     the underlying method's parameter types refer to a parameterized
239      *     type that cannot be instantiated for any reason
240      * @since 1.5
241      */
242     public Type[] getGenericParameterTypes() {
243         if (getSignature() != null)
244             return getGenericInfo().getParameterTypes();
245         else
246             return getParameterTypes();
247     }
248 
249 
250     /**
251      * Returns an array of {@code Class} objects that represent the types
252      * of exceptions declared to be thrown by the underlying constructor
253      * represented by this {@code Constructor} object.  Returns an array of
254      * length 0 if the constructor declares no exceptions in its {@code throws} clause.
255      *
256      * @return the exception types declared as being thrown by the
257      * constructor this object represents
258      */
259     public Class<?>[] getExceptionTypes() {
260         return (Class<?>[])exceptionTypes.clone();
261     }
262 
263 
264     /**
265      * Returns an array of {@code Type} objects that represent the
266      * exceptions declared to be thrown by this {@code Constructor} object.
267      * Returns an array of length 0 if the underlying method declares
268      * no exceptions in its {@code throws} clause.
269      *
270      * <p>If an exception type is a type variable or a parameterized
271      * type, it is created. Otherwise, it is resolved.
272      *
273      * @return an array of Types that represent the exception types
274      *     thrown by the underlying method
275      * @throws GenericSignatureFormatError
276      *     if the generic method signature does not conform to the format
277      *     specified in
278      *     <cite>The Java&trade; Virtual Machine Specification</cite>
279      * @throws TypeNotPresentException if the underlying method's
280      *     {@code throws} clause refers to a non-existent type declaration
281      * @throws MalformedParameterizedTypeException if
282      *     the underlying method's {@code throws} clause refers to a
283      *     parameterized type that cannot be instantiated for any reason
284      * @since 1.5
285      */
286       public Type[] getGenericExceptionTypes() {
287           Type[] result;
288           if (getSignature() != null &&
289               ( (result = getGenericInfo().getExceptionTypes()).length > 0  ))
290               return result;
291           else
292               return getExceptionTypes();
293       }
294 
295     /**
296      * Compares this {@code Constructor} against the specified object.
297      * Returns true if the objects are the same.  Two {@code Constructor} objects are
298      * the same if they were declared by the same class and have the
299      * same formal parameter types.
300      */
301     public boolean equals(Object obj) {
302         if (obj != null && obj instanceof Constructor) {
303             Constructor<?> other = (Constructor<?>)obj;
304             if (getDeclaringClass() == other.getDeclaringClass()) {
305                 /* Avoid unnecessary cloning */
306                 Class<?>[] params1 = parameterTypes;
307                 Class<?>[] params2 = other.parameterTypes;
308                 if (params1.length == params2.length) {
309                     for (int i = 0; i < params1.length; i++) {
310                         if (params1[i] != params2[i])
311                             return false;
312                     }
313                     return true;
314                 }
315             }
316         }
317         return false;
318     }
319 
320     /**
321      * Returns a hashcode for this {@code Constructor}. The hashcode is
322      * the same as the hashcode for the underlying constructor's
323      * declaring class name.
324      */
325     public int hashCode() {
326         return getDeclaringClass().getName().hashCode();
327     }
328 
329     /**
330      * Returns a string describing this {@code Constructor}.  The string is
331      * formatted as the constructor access modifiers, if any,
332      * followed by the fully-qualified name of the declaring class,
333      * followed by a parenthesized, comma-separated list of the
334      * constructor's formal parameter types.  For example:
335      * <pre>
336      *    public java.util.Hashtable(int,float)
337      * </pre>
338      *
339      * <p>The only possible modifiers for constructors are the access
340      * modifiers {@code public}, {@code protected} or
341      * {@code private}.  Only one of these may appear, or none if the
342      * constructor has default (package) access.
343      */
344     public String toString() {
345         try {
346             StringBuffer sb = new StringBuffer();
347             int mod = getModifiers() & Modifier.constructorModifiers();
348             if (mod != 0) {
349                 sb.append(Modifier.toString(mod) + " ");
350             }
351             sb.append(Field.getTypeName(getDeclaringClass()));
352             sb.append("(");
353             Class<?>[] params = parameterTypes; // avoid clone
354             for (int j = 0; j < params.length; j++) {
355                 sb.append(Field.getTypeName(params[j]));
356                 if (j < (params.length - 1))
357                     sb.append(",");
358             }
359             sb.append(")");
360             Class<?>[] exceptions = exceptionTypes; // avoid clone
361             if (exceptions.length > 0) {
362                 sb.append(" throws ");
363                 for (int k = 0; k < exceptions.length; k++) {
364                     sb.append(exceptions[k].getName());
365                     if (k < (exceptions.length - 1))
366                         sb.append(",");
367                 }
368             }
369             return sb.toString();
370         } catch (Exception e) {
371             return "<" + e + ">";
372         }
373     }
374 
375     /**
376      * Returns a string describing this {@code Constructor},
377      * including type parameters.  The string is formatted as the
378      * constructor access modifiers, if any, followed by an
379      * angle-bracketed comma separated list of the constructor's type
380      * parameters, if any, followed by the fully-qualified name of the
381      * declaring class, followed by a parenthesized, comma-separated
382      * list of the constructor's generic formal parameter types.
383      *
384      * If this constructor was declared to take a variable number of
385      * arguments, instead of denoting the last parameter as
386      * "<tt><i>Type</i>[]</tt>", it is denoted as
387      * "<tt><i>Type</i>...</tt>".
388      *
389      * A space is used to separate access modifiers from one another
390      * and from the type parameters or return type.  If there are no
391      * type parameters, the type parameter list is elided; if the type
392      * parameter list is present, a space separates the list from the
393      * class name.  If the constructor is declared to throw
394      * exceptions, the parameter list is followed by a space, followed
395      * by the word "{@code throws}" followed by a
396      * comma-separated list of the thrown exception types.
397      *
398      * <p>The only possible modifiers for constructors are the access
399      * modifiers {@code public}, {@code protected} or
400      * {@code private}.  Only one of these may appear, or none if the
401      * constructor has default (package) access.
402      *
403      * @return a string describing this {@code Constructor},
404      * include type parameters
405      *
406      * @since 1.5
407      */
408     public String toGenericString() {
409         try {
410             StringBuilder sb = new StringBuilder();
411             int mod = getModifiers() & Modifier.constructorModifiers();
412             if (mod != 0) {
413                 sb.append(Modifier.toString(mod) + " ");
414             }
415             TypeVariable<?>[] typeparms = getTypeParameters();
416             if (typeparms.length > 0) {
417                 boolean first = true;
418                 sb.append("<");
419                 for(TypeVariable<?> typeparm: typeparms) {
420                     if (!first)
421                         sb.append(",");
422                     // Class objects can't occur here; no need to test
423                     // and call Class.getName().
424                     sb.append(typeparm.toString());
425                     first = false;
426                 }
427                 sb.append("> ");
428             }
429             sb.append(Field.getTypeName(getDeclaringClass()));
430             sb.append("(");
431             Type[] params = getGenericParameterTypes();
432             for (int j = 0; j < params.length; j++) {
433                 String param = (params[j] instanceof Class<?>)?
434                     Field.getTypeName((Class<?>)params[j]):
435                     (params[j].toString());
436                 if (isVarArgs() && (j == params.length - 1)) // replace T[] with T...
437                     param = param.replaceFirst("\\[\\]$", "...");
438                 sb.append(param);
439                 if (j < (params.length - 1))
440                     sb.append(",");
441             }
442             sb.append(")");
443             Type[] exceptions = getGenericExceptionTypes();
444             if (exceptions.length > 0) {
445                 sb.append(" throws ");
446                 for (int k = 0; k < exceptions.length; k++) {
447                     sb.append((exceptions[k] instanceof Class)?
448                               ((Class<?>)exceptions[k]).getName():
449                               exceptions[k].toString());
450                     if (k < (exceptions.length - 1))
451                         sb.append(",");
452                 }
453             }
454             return sb.toString();
455         } catch (Exception e) {
456             return "<" + e + ">";
457         }
458     }
459 
460     /**
461      * Uses the constructor represented by this {@code Constructor} object to
462      * create and initialize a new instance of the constructor's
463      * declaring class, with the specified initialization parameters.
464      * Individual parameters are automatically unwrapped to match
465      * primitive formal parameters, and both primitive and reference
466      * parameters are subject to method invocation conversions as necessary.
467      *
468      * <p>If the number of formal parameters required by the underlying constructor
469      * is 0, the supplied {@code initargs} array may be of length 0 or null.
470      *
471      * <p>If the constructor's declaring class is an inner class in a
472      * non-static context, the first argument to the constructor needs
473      * to be the enclosing instance; see section 15.9.3 of
474      * <cite>The Java&trade; Language Specification</cite>.
475      *
476      * <p>If the required access and argument checks succeed and the
477      * instantiation will proceed, the constructor's declaring class
478      * is initialized if it has not already been initialized.
479      *
480      * <p>If the constructor completes normally, returns the newly
481      * created and initialized instance.
482      *
483      * @param initargs array of objects to be passed as arguments to
484      * the constructor call; values of primitive types are wrapped in
485      * a wrapper object of the appropriate type (e.g. a {@code float}
486      * in a {@link java.lang.Float Float})
487      *
488      * @return a new object created by calling the constructor
489      * this object represents
490      *
491      * @exception IllegalAccessException    if this {@code Constructor} object
492      *              is enforcing Java language access control and the underlying
493      *              constructor is inaccessible.
494      * @exception IllegalArgumentException  if the number of actual
495      *              and formal parameters differ; if an unwrapping
496      *              conversion for primitive arguments fails; or if,
497      *              after possible unwrapping, a parameter value
498      *              cannot be converted to the corresponding formal
499      *              parameter type by a method invocation conversion; if
500      *              this constructor pertains to an enum type.
501      * @exception InstantiationException    if the class that declares the
502      *              underlying constructor represents an abstract class.
503      * @exception InvocationTargetException if the underlying constructor
504      *              throws an exception.
505      * @exception ExceptionInInitializerError if the initialization provoked
506      *              by this method fails.
507      */
508     public T newInstance(Object ... initargs)
509         throws InstantiationException, IllegalAccessException,
510                IllegalArgumentException, InvocationTargetException
511     {
512         if (!override) {
513             if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
514                 Class<?> caller = Reflection.getCallerClass(2);
515 
516                 checkAccess(caller, clazz, null, modifiers);
517             }
518         }
519         if ((clazz.getModifiers() & Modifier.ENUM) != 0)
520             throw new IllegalArgumentException("Cannot reflectively create enum objects");
521         ConstructorAccessor ca = constructorAccessor;   // read volatile
522         if (ca == null) {
523             ca = acquireConstructorAccessor();
524         }
525         return (T) ca.newInstance(initargs);
526     }
527 
528     /**
529      * Returns {@code true} if this constructor was declared to take
530      * a variable number of arguments; returns {@code false}
531      * otherwise.
532      *
533      * @return {@code true} if an only if this constructor was declared to
534      * take a variable number of arguments.
535      * @since 1.5
536      */
537     public boolean isVarArgs() {
538         return (getModifiers() & Modifier.VARARGS) != 0;
539     }
540 
541     /**
542      * Returns {@code true} if this constructor is a synthetic
543      * constructor; returns {@code false} otherwise.
544      *
545      * @return true if and only if this constructor is a synthetic
546      * constructor as defined by
547      * <cite>The Java&trade; Language Specification</cite>.
548      * @since 1.5
549      */
550     public boolean isSynthetic() {
551         return Modifier.isSynthetic(getModifiers());
552     }
553 
554     // NOTE that there is no synchronization used here. It is correct
555     // (though not efficient) to generate more than one
556     // ConstructorAccessor for a given Constructor. However, avoiding
557     // synchronization will probably make the implementation more
558     // scalable.
559     private ConstructorAccessor acquireConstructorAccessor() {
560         // First check to see if one has been created yet, and take it
561         // if so.
562         ConstructorAccessor tmp = null;
563         if (root != null) tmp = root.getConstructorAccessor();
564         if (tmp != null) {
565             constructorAccessor = tmp;
566         } else {
567             // Otherwise fabricate one and propagate it up to the root
568             tmp = reflectionFactory.newConstructorAccessor(this);
569             setConstructorAccessor(tmp);
570         }
571 
572         return tmp;
573     }
574 
575     // Returns ConstructorAccessor for this Constructor object, not
576     // looking up the chain to the root
577     ConstructorAccessor getConstructorAccessor() {
578         return constructorAccessor;
579     }
580 
581     // Sets the ConstructorAccessor for this Constructor object and
582     // (recursively) its root
583     void setConstructorAccessor(ConstructorAccessor accessor) {
584         constructorAccessor = accessor;
585         // Propagate up
586         if (root != null) {
587             root.setConstructorAccessor(accessor);
588         }
589     }
590 
591     int getSlot() {
592         return slot;
593     }
594 
595    String getSignature() {
596             return signature;
597    }
598 
599     byte[] getRawAnnotations() {
600         return annotations;
601     }
602 
603     byte[] getRawParameterAnnotations() {
604         return parameterAnnotations;
605     }
606 
607     /**
608      * @throws NullPointerException {@inheritDoc}
609      * @since 1.5
610      */
611     public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
612         if (annotationClass == null)
613             throw new NullPointerException();
614 
615         return (T) declaredAnnotations().get(annotationClass);
616     }
617 
618     /**
619      * @since 1.5
620      */
621     public Annotation[] getDeclaredAnnotations()  {
622         return AnnotationParser.toArray(declaredAnnotations());
623     }
624 
625     private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
626 
627     private synchronized  Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
628         if (declaredAnnotations == null) {
629             declaredAnnotations = AnnotationParser.parseAnnotations(
630                 annotations, sun.misc.SharedSecrets.getJavaLangAccess().
631                 getConstantPool(getDeclaringClass()),
632                 getDeclaringClass());
633         }
634         return declaredAnnotations;
635     }
636 
637     /**
638      * Returns an array of arrays that represent the annotations on the formal
639      * parameters, in declaration order, of the method represented by
640      * this {@code Constructor} object. (Returns an array of length zero if the
641      * underlying method is parameterless.  If the method has one or more
642      * parameters, a nested array of length zero is returned for each parameter
643      * with no annotations.) The annotation objects contained in the returned
644      * arrays are serializable.  The caller of this method is free to modify
645      * the returned arrays; it will have no effect on the arrays returned to
646      * other callers.
647      *
648      * @return an array of arrays that represent the annotations on the formal
649      *    parameters, in declaration order, of the method represented by this
650      *    Constructor object
651      * @since 1.5
652      */
653     public Annotation[][] getParameterAnnotations() {
654         int numParameters = parameterTypes.length;
655         if (parameterAnnotations == null)
656             return new Annotation[numParameters][0];
657 
658         Annotation[][] result = AnnotationParser.parseParameterAnnotations(
659             parameterAnnotations,
660             sun.misc.SharedSecrets.getJavaLangAccess().
661                 getConstantPool(getDeclaringClass()),
662             getDeclaringClass());
663         if (result.length != numParameters) {
664             Class<?> declaringClass = getDeclaringClass();
665             if (declaringClass.isEnum() ||
666                 declaringClass.isAnonymousClass() ||
667                 declaringClass.isLocalClass() )
668                 ; // Can't do reliable parameter counting
669             else {
670                 if (!declaringClass.isMemberClass() || // top-level
671                     // Check for the enclosing instance parameter for
672                     // non-static member classes
673                     (declaringClass.isMemberClass() &&
674                      ((declaringClass.getModifiers() & Modifier.STATIC) == 0)  &&
675                      result.length + 1 != numParameters) ) {
676                     throw new AnnotationFormatError(
677                               "Parameter annotations don't match number of parameters");
678                 }
679             }
680         }
681         return result;
682     }
683 }